package com.smart.community.feign.region.fallback;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.stereotype.Component;

import com.smart.community.feign.common.BaseFeignFallbackFactory;
import com.smart.community.feign.region.dto.PropertyHouseTypeDTO;
import com.smart.community.feign.region.service.PropertyHouseTypeFeignService;

import lombok.extern.slf4j.Slf4j;

/**
 * 物业公司户型配置Feign降级处理工厂
 * 
 * 当区域服务户型配置接口调用失败时，提供降级处理：
 * 1. 返回安全的默认值，避免调用方异常
 * 2. 记录详细的错误日志，便于问题排查
 * 3. 确保系统稳定性，避免级联故障
 * 
 * @author Wu.Liang
 * @version 2.0.0
 * @since 2025-01-30
 * @updated 2025-08-28 - 继承BaseFeignFallbackFactory，使用统一的降级处理标准
 */
@Slf4j
@Component
public class PropertyHouseTypeFeignFallbackFactory extends BaseFeignFallbackFactory<PropertyHouseTypeFeignService> {
    
    @Override
    public PropertyHouseTypeFeignService create(Throwable cause) {
        // 使用基类的统一日志记录方法，区分异常类型
        if (isServiceUnavailable(cause)) {
            logServiceUnavailable(getServiceName(), cause);
        } else {
            log.warn("{}服务调用异常，执行降级处理: {}", getServiceName(), cause.getMessage());
        }
        
        return new PropertyHouseTypeFeignService() {
            
            @Override
            public PropertyHouseTypeDTO getHouseTypeById(Long id) {
                logMethodFallback("getHouseTypeById", id);
                return new PropertyHouseTypeDTO(); // 返回空对象，不影响业务
            }
            
            @Override
            public List<PropertyHouseTypeDTO> getHouseTypesByPropertyCompanyId(Long propertyCompanyId) {
                logMethodFallback("getHouseTypesByPropertyCompanyId", propertyCompanyId);
                return new ArrayList<>(); // 返回空列表，不影响业务
            }
            
            @Override
            public List<PropertyHouseTypeDTO> getHouseTypesByPropertyCompanyIds(List<Long> propertyCompanyIds) {
                logMethodFallback("getHouseTypesByPropertyCompanyIds", propertyCompanyIds);
                return new ArrayList<>(); // 返回空列表，不影响业务
            }
            
            @Override
            public Map<Long, List<PropertyHouseTypeDTO>> getHouseTypesByPropertyCompanyIdsGrouped(List<Long> propertyCompanyIds) {
                logMethodFallback("getHouseTypesByPropertyCompanyIdsGrouped", propertyCompanyIds);
                return new HashMap<>(); // 返回空Map，不影响业务
            }
            
            @Override
            public Boolean isHouseTypeNameExists(String houseTypeName, Long propertyCompanyId, Long excludeId) {
                logMethodFallback("isHouseTypeNameExists", houseTypeName, propertyCompanyId, excludeId);
                return false; // 返回false，表示不存在，允许创建
            }
            
            @Override
            public List<PropertyHouseTypeDTO> getHouseTypesByIds(List<Long> ids) {
                logMethodFallback("getHouseTypesByIds", ids);
                return new ArrayList<>(); // 返回空列表，不影响业务
            }
            
            @Override
            public List<PropertyHouseTypeDTO> searchHouseTypesByName(String houseTypeName, Long propertyCompanyId) {
                logMethodFallback("searchHouseTypesByName", houseTypeName, propertyCompanyId);
                return new ArrayList<>(); // 返回空列表，不影响业务
            }
            
            @Override
            public List<PropertyHouseTypeDTO> getEnabledHouseTypes(Long propertyCompanyId) {
                logMethodFallback("getEnabledHouseTypes", propertyCompanyId);
                return new ArrayList<>(); // 返回空列表，不影响业务
            }
            
            @Override
            public List<PropertyHouseTypeDTO> searchHouseTypesByArea(Double minArea, Double maxArea, Long propertyCompanyId) {
                logMethodFallback("searchHouseTypesByArea", minArea, maxArea, propertyCompanyId);
                return new ArrayList<>(); // 返回空列表，不影响业务
            }
            
            @Override
            public List<PropertyHouseTypeDTO> searchHouseTypesByOrientation(String orientation, Long propertyCompanyId) {
                logMethodFallback("searchHouseTypesByOrientation", orientation, propertyCompanyId);
                return new ArrayList<>(); // 返回空列表，不影响业务
            }
            
            @Override
            public List<PropertyHouseTypeDTO> searchHouseTypesByCrowd(String suitableCrowd, Long propertyCompanyId) {
                logMethodFallback("searchHouseTypesByCrowd", suitableCrowd, propertyCompanyId);
                return new ArrayList<>(); // 返回空列表，不影响业务
            }
            
            @Override
            public Object getHouseTypeStatistics(Long propertyCompanyId) {
                logMethodFallback("getHouseTypeStatistics", propertyCompanyId);
                return new HashMap<>(); // 返回空Map，不影响业务
            }
            
            @Override
            public Boolean checkHouseTypeExists(Long id) {
                logMethodFallback("checkHouseTypeExists", id);
                return false; // 返回false，表示不存在
            }
        };
    }
    
    @Override
    protected String getServiceName() {
        return "户型配置服务";
    }
}
